package com.icongyou.enterprise.talent_analysis.listener;

import com.icongyou.enterprise.talent_analysis.entity.PortraitUpdateTask;
import com.icongyou.enterprise.talent_analysis.event.TemplateChangeEvent;
import com.icongyou.enterprise.talent_analysis.mapper.PortraitUpdateTaskMapper;
import com.icongyou.enterprise.talent_analysis.service.PortraitCacheService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;

/**
 * 画像模板变更监听器
 * 当HR切换模板时,触发所有相关学生的画像重新计算
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class PortraitTemplateChangeListener {
    
    private final PortraitCacheService cacheService;
    private final PortraitUpdateTaskMapper taskMapper;
    
    /**
     * 监听模板变更事件
     * 批量创建画像更新任务
     */
    @EventListener
    @Async("aiInsightTaskExecutor")
    public void handleTemplateChange(TemplateChangeEvent event) {
        log.info("收到模板变更事件 - HR: {}, 企业: {}, 旧模板: {}, 新模板: {}", 
            event.getHrUserId(), event.getEnterpriseId(), 
            event.getOldTemplateId(), event.getNewTemplateId());
        
        try {
            // 1. 清除旧模板的画像缓存
            if (event.getOldTemplateId() != null) {
                log.info("清除旧模板缓存: {}", event.getOldTemplateId());
                cacheService.invalidateTemplateCache(event.getOldTemplateId());
            }
            
            // 2. 如果指定了受影响的学生列表,为每个学生创建更新任务
            if (event.getAffectedStudentIds() != null && !event.getAffectedStudentIds().isEmpty()) {
                log.info("为 {} 个学生创建画像更新任务", event.getAffectedStudentIds().size());
                createUpdateTasks(event.getAffectedStudentIds(), event.getNewTemplateId());
            } else {
                // 3. 如果没有指定学生列表,需要查询该HR负责的所有学生
                log.warn("未指定受影响的学生列表,暂不创建更新任务。建议在切换模板时传入学生列表。");
                // TODO: 可以查询 student 表中 hr_user_id = event.getHrUserId() 的所有学生
            }
            
        } catch (Exception e) {
            log.error("处理模板变更事件失败", e);
        }
    }
    
    /**
     * 为学生列表创建画像更新任务
     */
    private void createUpdateTasks(List<String> studentIds, String templateId) {
        LocalDateTime now = LocalDateTime.now();
        
        for (String studentId : studentIds) {
            try {
                PortraitUpdateTask task = new PortraitUpdateTask();
                task.setId(UUID.randomUUID().toString());
                task.setStudentId(studentId);
                task.setTemplateId(templateId);
                task.setTriggerType("TEMPLATE_CHANGE");
                task.setTriggerSource("HR_SWITCH");
                task.setStatus("PENDING");
                task.setRetryCount(0);
                task.setCreatedAt(now);
                
                taskMapper.insert(task);
                log.debug("已创建画像更新任务 - 学生: {}, 模板: {}", studentId, templateId);
            } catch (Exception e) {
                log.error("创建画像更新任务失败 - 学生: {}", studentId, e);
            }
        }
    }
}
